GtkContainer: fix disconnection from frame clock
authorOwen W. Taylor <otaylor@fishsoup.net>
Thu, 14 Feb 2013 22:11:28 +0000 (17:11 -0500)
committerOwen W. Taylor <otaylor@fishsoup.net>
Thu, 14 Feb 2013 22:19:53 +0000 (17:19 -0500)
We need to disconnect the frame clock when we unrealize (at which
point the old clock is still alive) not in destroy(). Since there
is no common unrealize for containers, trigger this from GtkWidget.

gtk/gtkcontainer.c
gtk/gtkcontainerprivate.h
gtk/gtkwidget.c

index e73ef2a7000ac054c79cd1509598dc3fcc7aa4f2..ce16fe4df42e224471754b0886415b08b200e474 100644 (file)
@@ -1362,13 +1362,6 @@ gtk_container_destroy (GtkWidget *widget)
   if (priv->restyle_pending)
     priv->restyle_pending = FALSE;
 
-  if (priv->resize_handler)
-    {
-      g_signal_handler_disconnect (priv->resize_clock, priv->resize_handler);
-      priv->resize_handler = 0;
-      priv->resize_clock = NULL;
-    }
-
   if (priv->focus_child)
     {
       g_object_unref (priv->focus_child);
@@ -1680,9 +1673,7 @@ gtk_container_idle_sizer (GdkFrameClock *clock,
 
   if (!container->priv->restyle_pending && !container->priv->resize_pending)
     {
-      g_signal_handler_disconnect (clock, container->priv->resize_handler);
-      container->priv->resize_handler = 0;
-      container->priv->resize_clock = NULL;
+      _gtk_container_stop_idle_sizer (container);
     }
   else
     {
@@ -1710,6 +1701,18 @@ gtk_container_start_idle_sizer (GtkContainer *container)
                                  GDK_FRAME_CLOCK_PHASE_LAYOUT);
 }
 
+void
+_gtk_container_stop_idle_sizer (GtkContainer *container)
+{
+  if (container->priv->resize_handler == 0)
+    return;
+
+  g_signal_handler_disconnect (container->priv->resize_clock,
+                               container->priv->resize_handler);
+  container->priv->resize_handler = 0;
+  container->priv->resize_clock = NULL;
+}
+
 static void
 gtk_container_queue_resize_handler (GtkContainer *container)
 {
index cd4bc5b2e9515fb5bb413c59c6181617d2a2983b..dd989d2dc73f08c9b77025ec7961b652e4a9f03f 100644 (file)
@@ -39,6 +39,7 @@ GList *  _gtk_container_focus_sort             (GtkContainer     *container,
                                                 GtkWidget        *old_focus);
 gboolean _gtk_container_get_reallocate_redraws (GtkContainer *container);
 
+void      _gtk_container_stop_idle_sizer        (GtkContainer *container);
 void      _gtk_container_maybe_start_idle_sizer (GtkContainer *container);
 
 G_END_DECLS
index 79cf9e2ea1e9782439613b89edfdfbfd6820f387..48f996063eb5eb0eefc023de055c6e672fdeac9b 100644 (file)
@@ -4694,6 +4694,9 @@ gtk_widget_connect_frame_clock (GtkWidget     *widget,
 {
   GtkWidgetPrivate *priv = widget->priv;
 
+  if (GTK_IS_CONTAINER (widget))
+    _gtk_container_maybe_start_idle_sizer (GTK_CONTAINER (widget));
+
   if (priv->tick_callbacks != NULL)
     {
       g_signal_connect (frame_clock, "update",
@@ -4713,6 +4716,9 @@ gtk_widget_disconnect_frame_clock (GtkWidget     *widget,
 {
   GtkWidgetPrivate *priv = widget->priv;
 
+  if (GTK_IS_CONTAINER (widget))
+    _gtk_container_stop_idle_sizer (GTK_CONTAINER (widget));
+
   if (priv->tick_callbacks)
     g_signal_handlers_disconnect_by_func (frame_clock,
                                           (gpointer) gtk_widget_on_frame_clock_update,
@@ -4802,9 +4808,6 @@ gtk_widget_realize (GtkWidget *widget)
       _gtk_widget_enable_device_events (widget);
       gtk_widget_update_devices_mask (widget, TRUE);
 
-      if (GTK_IS_CONTAINER (widget))
-        _gtk_container_maybe_start_idle_sizer (GTK_CONTAINER (widget));
-
       gtk_widget_connect_frame_clock (widget,
                                       gtk_widget_get_frame_clock (widget));